Added ENABLE_SHADOW_FB
authorAlexander Larsson <alexl@redhat.com>
Thu, 11 Jan 2001 16:39:21 +0000 (16:39 +0000)
committerAlexander Larsson <alexl@src.gnome.org>
Thu, 11 Jan 2001 16:39:21 +0000 (16:39 +0000)
2001-01-11  Alexander Larsson  <alexl@redhat.com>

* acconfig.h:
Added ENABLE_SHADOW_FB

* configure.in:
Added --disable-shadowfb

* gdk/linux-fb/gdkcursor-fb.c:
Update shadowfb when updating cursor

* gdk/linux-fb/gdkdrawable-fb2.c:
Added wrappers for shadowfb that calls  the normal drawable
methods, but calls gdk_shadow_fb_update(bounding box) when
GdkWindows are drawed to.
Moved gdk_draw_glyphs implementation to _gdk_draw_glyphs
which also returns the bounding box.

* gdk/linux-fb/gdkfb.h:
Added GdkFBAngle type and gdk_fb_set_rotation declaration.

* gdk/linux-fb/gdkgeometry-fb.c:
Update shadowfb when scrolling window.

* gdk/linux-fb/gdkglobals-fb.c:
Add _gdk_fb_screen_angle.

* gdk/linux-fb/gdkkeyboard-fb.c:
Test code for screen rotation. Shift-F2 in the xlate driver
rotates the screen.

* gdk/linux-fb/gdkmain-fb.c:
Handle shadowfb. Add gdk_fb_set_rotation(). Remove CM and RP.

* gdk/linux-fb/gdkmouse-fb.c:
Use fb_width/height instead of modeinfo.xres/yres.

* gdk/linux-fb/gdkprivate-fb.h:
Added fb_men, fb_width, fb_height & fb_stride. When using
shadow fb these can differ from the framebuffer stuff.
Declarations for gdk_shadow_fb_update, gdk_shadow_fb_init,
gdk_shadow_fb_stop_updates, gdk_fb_recompute_all,
_gdk_fb_screen_angle. Removed CM, RP.

* gdk/linux-fb/gdkrender-fb.c:
Added code for shadowfb handling and screen rotation using
shadowfb.

* gdk/linux-fb/gdkwindow-fb.c:
Use fb_mem, fb_stride, fb_width, fb_height.
Added recompute_rowstride to reset the rowstride of all windows.
Added gdk_fb_recompute_all() which recomputes rootwindow size,
window abs positions and window rowstrides. Usefull when the
rotation has changed.

20 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
acconfig.h
configure.in
gdk/linux-fb/gdkcursor-fb.c
gdk/linux-fb/gdkdrawable-fb2.c
gdk/linux-fb/gdkfb.h
gdk/linux-fb/gdkgeometry-fb.c
gdk/linux-fb/gdkglobals-fb.c
gdk/linux-fb/gdkkeyboard-fb.c
gdk/linux-fb/gdkmain-fb.c
gdk/linux-fb/gdkmouse-fb.c
gdk/linux-fb/gdkprivate-fb.h
gdk/linux-fb/gdkrender-fb.c
gdk/linux-fb/gdkwindow-fb.c

index 8dd60852ca1fa91a5d87fe35d70ba0295a21c81c..3c6ce731e662ef4a37da2a04f463ad181f5b3f08 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,58 @@
+2001-01-11  Alexander Larsson  <alexl@redhat.com>
+
+       * acconfig.h:
+       Added ENABLE_SHADOW_FB
+
+       * configure.in:
+       Added --disable-shadowfb
+
+       * gdk/linux-fb/gdkcursor-fb.c:
+       Update shadowfb when updating cursor
+
+       * gdk/linux-fb/gdkdrawable-fb2.c:
+       Added wrappers for shadowfb that calls  the normal drawable
+       methods, but calls gdk_shadow_fb_update(bounding box) when
+       GdkWindows are drawed to.
+       Moved gdk_draw_glyphs implementation to _gdk_draw_glyphs
+       which also returns the bounding box.
+
+       * gdk/linux-fb/gdkfb.h:
+       Added GdkFBAngle type and gdk_fb_set_rotation declaration.
+
+       * gdk/linux-fb/gdkgeometry-fb.c:
+       Update shadowfb when scrolling window.
+
+       * gdk/linux-fb/gdkglobals-fb.c:
+       Add _gdk_fb_screen_angle.
+       
+       * gdk/linux-fb/gdkkeyboard-fb.c:
+       Test code for screen rotation. Shift-F2 in the xlate driver
+       rotates the screen.
+
+       * gdk/linux-fb/gdkmain-fb.c:
+       Handle shadowfb. Add gdk_fb_set_rotation(). Remove CM and RP.
+
+       * gdk/linux-fb/gdkmouse-fb.c:
+       Use fb_width/height instead of modeinfo.xres/yres.
+
+       * gdk/linux-fb/gdkprivate-fb.h:
+       Added fb_men, fb_width, fb_height & fb_stride. When using
+       shadow fb these can differ from the framebuffer stuff.
+       Declarations for gdk_shadow_fb_update, gdk_shadow_fb_init,
+       gdk_shadow_fb_stop_updates, gdk_fb_recompute_all,
+       _gdk_fb_screen_angle. Removed CM, RP.
+
+       * gdk/linux-fb/gdkrender-fb.c:
+       Added code for shadowfb handling and screen rotation using
+       shadowfb.
+
+       * gdk/linux-fb/gdkwindow-fb.c:
+       Use fb_mem, fb_stride, fb_width, fb_height.
+       Added recompute_rowstride to reset the rowstride of all windows.
+       Added gdk_fb_recompute_all() which recomputes rootwindow size,
+       window abs positions and window rowstrides. Usefull when the
+       rotation has changed.
+
 Thu Jan 11 13:16:50 GMT 2001  Tony Gale <gale@gtk.org>
 
        * docs/faq/gtk-faq.sgml: update to make web site updating easier
index 8dd60852ca1fa91a5d87fe35d70ba0295a21c81c..3c6ce731e662ef4a37da2a04f463ad181f5b3f08 100644 (file)
@@ -1,3 +1,58 @@
+2001-01-11  Alexander Larsson  <alexl@redhat.com>
+
+       * acconfig.h:
+       Added ENABLE_SHADOW_FB
+
+       * configure.in:
+       Added --disable-shadowfb
+
+       * gdk/linux-fb/gdkcursor-fb.c:
+       Update shadowfb when updating cursor
+
+       * gdk/linux-fb/gdkdrawable-fb2.c:
+       Added wrappers for shadowfb that calls  the normal drawable
+       methods, but calls gdk_shadow_fb_update(bounding box) when
+       GdkWindows are drawed to.
+       Moved gdk_draw_glyphs implementation to _gdk_draw_glyphs
+       which also returns the bounding box.
+
+       * gdk/linux-fb/gdkfb.h:
+       Added GdkFBAngle type and gdk_fb_set_rotation declaration.
+
+       * gdk/linux-fb/gdkgeometry-fb.c:
+       Update shadowfb when scrolling window.
+
+       * gdk/linux-fb/gdkglobals-fb.c:
+       Add _gdk_fb_screen_angle.
+       
+       * gdk/linux-fb/gdkkeyboard-fb.c:
+       Test code for screen rotation. Shift-F2 in the xlate driver
+       rotates the screen.
+
+       * gdk/linux-fb/gdkmain-fb.c:
+       Handle shadowfb. Add gdk_fb_set_rotation(). Remove CM and RP.
+
+       * gdk/linux-fb/gdkmouse-fb.c:
+       Use fb_width/height instead of modeinfo.xres/yres.
+
+       * gdk/linux-fb/gdkprivate-fb.h:
+       Added fb_men, fb_width, fb_height & fb_stride. When using
+       shadow fb these can differ from the framebuffer stuff.
+       Declarations for gdk_shadow_fb_update, gdk_shadow_fb_init,
+       gdk_shadow_fb_stop_updates, gdk_fb_recompute_all,
+       _gdk_fb_screen_angle. Removed CM, RP.
+
+       * gdk/linux-fb/gdkrender-fb.c:
+       Added code for shadowfb handling and screen rotation using
+       shadowfb.
+
+       * gdk/linux-fb/gdkwindow-fb.c:
+       Use fb_mem, fb_stride, fb_width, fb_height.
+       Added recompute_rowstride to reset the rowstride of all windows.
+       Added gdk_fb_recompute_all() which recomputes rootwindow size,
+       window abs positions and window rowstrides. Usefull when the
+       rotation has changed.
+
 Thu Jan 11 13:16:50 GMT 2001  Tony Gale <gale@gtk.org>
 
        * docs/faq/gtk-faq.sgml: update to make web site updating easier
index 8dd60852ca1fa91a5d87fe35d70ba0295a21c81c..3c6ce731e662ef4a37da2a04f463ad181f5b3f08 100644 (file)
@@ -1,3 +1,58 @@
+2001-01-11  Alexander Larsson  <alexl@redhat.com>
+
+       * acconfig.h:
+       Added ENABLE_SHADOW_FB
+
+       * configure.in:
+       Added --disable-shadowfb
+
+       * gdk/linux-fb/gdkcursor-fb.c:
+       Update shadowfb when updating cursor
+
+       * gdk/linux-fb/gdkdrawable-fb2.c:
+       Added wrappers for shadowfb that calls  the normal drawable
+       methods, but calls gdk_shadow_fb_update(bounding box) when
+       GdkWindows are drawed to.
+       Moved gdk_draw_glyphs implementation to _gdk_draw_glyphs
+       which also returns the bounding box.
+
+       * gdk/linux-fb/gdkfb.h:
+       Added GdkFBAngle type and gdk_fb_set_rotation declaration.
+
+       * gdk/linux-fb/gdkgeometry-fb.c:
+       Update shadowfb when scrolling window.
+
+       * gdk/linux-fb/gdkglobals-fb.c:
+       Add _gdk_fb_screen_angle.
+       
+       * gdk/linux-fb/gdkkeyboard-fb.c:
+       Test code for screen rotation. Shift-F2 in the xlate driver
+       rotates the screen.
+
+       * gdk/linux-fb/gdkmain-fb.c:
+       Handle shadowfb. Add gdk_fb_set_rotation(). Remove CM and RP.
+
+       * gdk/linux-fb/gdkmouse-fb.c:
+       Use fb_width/height instead of modeinfo.xres/yres.
+
+       * gdk/linux-fb/gdkprivate-fb.h:
+       Added fb_men, fb_width, fb_height & fb_stride. When using
+       shadow fb these can differ from the framebuffer stuff.
+       Declarations for gdk_shadow_fb_update, gdk_shadow_fb_init,
+       gdk_shadow_fb_stop_updates, gdk_fb_recompute_all,
+       _gdk_fb_screen_angle. Removed CM, RP.
+
+       * gdk/linux-fb/gdkrender-fb.c:
+       Added code for shadowfb handling and screen rotation using
+       shadowfb.
+
+       * gdk/linux-fb/gdkwindow-fb.c:
+       Use fb_mem, fb_stride, fb_width, fb_height.
+       Added recompute_rowstride to reset the rowstride of all windows.
+       Added gdk_fb_recompute_all() which recomputes rootwindow size,
+       window abs positions and window rowstrides. Usefull when the
+       rotation has changed.
+
 Thu Jan 11 13:16:50 GMT 2001  Tony Gale <gale@gtk.org>
 
        * docs/faq/gtk-faq.sgml: update to make web site updating easier
index 8dd60852ca1fa91a5d87fe35d70ba0295a21c81c..3c6ce731e662ef4a37da2a04f463ad181f5b3f08 100644 (file)
@@ -1,3 +1,58 @@
+2001-01-11  Alexander Larsson  <alexl@redhat.com>
+
+       * acconfig.h:
+       Added ENABLE_SHADOW_FB
+
+       * configure.in:
+       Added --disable-shadowfb
+
+       * gdk/linux-fb/gdkcursor-fb.c:
+       Update shadowfb when updating cursor
+
+       * gdk/linux-fb/gdkdrawable-fb2.c:
+       Added wrappers for shadowfb that calls  the normal drawable
+       methods, but calls gdk_shadow_fb_update(bounding box) when
+       GdkWindows are drawed to.
+       Moved gdk_draw_glyphs implementation to _gdk_draw_glyphs
+       which also returns the bounding box.
+
+       * gdk/linux-fb/gdkfb.h:
+       Added GdkFBAngle type and gdk_fb_set_rotation declaration.
+
+       * gdk/linux-fb/gdkgeometry-fb.c:
+       Update shadowfb when scrolling window.
+
+       * gdk/linux-fb/gdkglobals-fb.c:
+       Add _gdk_fb_screen_angle.
+       
+       * gdk/linux-fb/gdkkeyboard-fb.c:
+       Test code for screen rotation. Shift-F2 in the xlate driver
+       rotates the screen.
+
+       * gdk/linux-fb/gdkmain-fb.c:
+       Handle shadowfb. Add gdk_fb_set_rotation(). Remove CM and RP.
+
+       * gdk/linux-fb/gdkmouse-fb.c:
+       Use fb_width/height instead of modeinfo.xres/yres.
+
+       * gdk/linux-fb/gdkprivate-fb.h:
+       Added fb_men, fb_width, fb_height & fb_stride. When using
+       shadow fb these can differ from the framebuffer stuff.
+       Declarations for gdk_shadow_fb_update, gdk_shadow_fb_init,
+       gdk_shadow_fb_stop_updates, gdk_fb_recompute_all,
+       _gdk_fb_screen_angle. Removed CM, RP.
+
+       * gdk/linux-fb/gdkrender-fb.c:
+       Added code for shadowfb handling and screen rotation using
+       shadowfb.
+
+       * gdk/linux-fb/gdkwindow-fb.c:
+       Use fb_mem, fb_stride, fb_width, fb_height.
+       Added recompute_rowstride to reset the rowstride of all windows.
+       Added gdk_fb_recompute_all() which recomputes rootwindow size,
+       window abs positions and window rowstrides. Usefull when the
+       rotation has changed.
+
 Thu Jan 11 13:16:50 GMT 2001  Tony Gale <gale@gtk.org>
 
        * docs/faq/gtk-faq.sgml: update to make web site updating easier
index 8dd60852ca1fa91a5d87fe35d70ba0295a21c81c..3c6ce731e662ef4a37da2a04f463ad181f5b3f08 100644 (file)
@@ -1,3 +1,58 @@
+2001-01-11  Alexander Larsson  <alexl@redhat.com>
+
+       * acconfig.h:
+       Added ENABLE_SHADOW_FB
+
+       * configure.in:
+       Added --disable-shadowfb
+
+       * gdk/linux-fb/gdkcursor-fb.c:
+       Update shadowfb when updating cursor
+
+       * gdk/linux-fb/gdkdrawable-fb2.c:
+       Added wrappers for shadowfb that calls  the normal drawable
+       methods, but calls gdk_shadow_fb_update(bounding box) when
+       GdkWindows are drawed to.
+       Moved gdk_draw_glyphs implementation to _gdk_draw_glyphs
+       which also returns the bounding box.
+
+       * gdk/linux-fb/gdkfb.h:
+       Added GdkFBAngle type and gdk_fb_set_rotation declaration.
+
+       * gdk/linux-fb/gdkgeometry-fb.c:
+       Update shadowfb when scrolling window.
+
+       * gdk/linux-fb/gdkglobals-fb.c:
+       Add _gdk_fb_screen_angle.
+       
+       * gdk/linux-fb/gdkkeyboard-fb.c:
+       Test code for screen rotation. Shift-F2 in the xlate driver
+       rotates the screen.
+
+       * gdk/linux-fb/gdkmain-fb.c:
+       Handle shadowfb. Add gdk_fb_set_rotation(). Remove CM and RP.
+
+       * gdk/linux-fb/gdkmouse-fb.c:
+       Use fb_width/height instead of modeinfo.xres/yres.
+
+       * gdk/linux-fb/gdkprivate-fb.h:
+       Added fb_men, fb_width, fb_height & fb_stride. When using
+       shadow fb these can differ from the framebuffer stuff.
+       Declarations for gdk_shadow_fb_update, gdk_shadow_fb_init,
+       gdk_shadow_fb_stop_updates, gdk_fb_recompute_all,
+       _gdk_fb_screen_angle. Removed CM, RP.
+
+       * gdk/linux-fb/gdkrender-fb.c:
+       Added code for shadowfb handling and screen rotation using
+       shadowfb.
+
+       * gdk/linux-fb/gdkwindow-fb.c:
+       Use fb_mem, fb_stride, fb_width, fb_height.
+       Added recompute_rowstride to reset the rowstride of all windows.
+       Added gdk_fb_recompute_all() which recomputes rootwindow size,
+       window abs positions and window rowstrides. Usefull when the
+       rotation has changed.
+
 Thu Jan 11 13:16:50 GMT 2001  Tony Gale <gale@gtk.org>
 
        * docs/faq/gtk-faq.sgml: update to make web site updating easier
index 8dd60852ca1fa91a5d87fe35d70ba0295a21c81c..3c6ce731e662ef4a37da2a04f463ad181f5b3f08 100644 (file)
@@ -1,3 +1,58 @@
+2001-01-11  Alexander Larsson  <alexl@redhat.com>
+
+       * acconfig.h:
+       Added ENABLE_SHADOW_FB
+
+       * configure.in:
+       Added --disable-shadowfb
+
+       * gdk/linux-fb/gdkcursor-fb.c:
+       Update shadowfb when updating cursor
+
+       * gdk/linux-fb/gdkdrawable-fb2.c:
+       Added wrappers for shadowfb that calls  the normal drawable
+       methods, but calls gdk_shadow_fb_update(bounding box) when
+       GdkWindows are drawed to.
+       Moved gdk_draw_glyphs implementation to _gdk_draw_glyphs
+       which also returns the bounding box.
+
+       * gdk/linux-fb/gdkfb.h:
+       Added GdkFBAngle type and gdk_fb_set_rotation declaration.
+
+       * gdk/linux-fb/gdkgeometry-fb.c:
+       Update shadowfb when scrolling window.
+
+       * gdk/linux-fb/gdkglobals-fb.c:
+       Add _gdk_fb_screen_angle.
+       
+       * gdk/linux-fb/gdkkeyboard-fb.c:
+       Test code for screen rotation. Shift-F2 in the xlate driver
+       rotates the screen.
+
+       * gdk/linux-fb/gdkmain-fb.c:
+       Handle shadowfb. Add gdk_fb_set_rotation(). Remove CM and RP.
+
+       * gdk/linux-fb/gdkmouse-fb.c:
+       Use fb_width/height instead of modeinfo.xres/yres.
+
+       * gdk/linux-fb/gdkprivate-fb.h:
+       Added fb_men, fb_width, fb_height & fb_stride. When using
+       shadow fb these can differ from the framebuffer stuff.
+       Declarations for gdk_shadow_fb_update, gdk_shadow_fb_init,
+       gdk_shadow_fb_stop_updates, gdk_fb_recompute_all,
+       _gdk_fb_screen_angle. Removed CM, RP.
+
+       * gdk/linux-fb/gdkrender-fb.c:
+       Added code for shadowfb handling and screen rotation using
+       shadowfb.
+
+       * gdk/linux-fb/gdkwindow-fb.c:
+       Use fb_mem, fb_stride, fb_width, fb_height.
+       Added recompute_rowstride to reset the rowstride of all windows.
+       Added gdk_fb_recompute_all() which recomputes rootwindow size,
+       window abs positions and window rowstrides. Usefull when the
+       rotation has changed.
+
 Thu Jan 11 13:16:50 GMT 2001  Tony Gale <gale@gtk.org>
 
        * docs/faq/gtk-faq.sgml: update to make web site updating easier
index 8dd60852ca1fa91a5d87fe35d70ba0295a21c81c..3c6ce731e662ef4a37da2a04f463ad181f5b3f08 100644 (file)
@@ -1,3 +1,58 @@
+2001-01-11  Alexander Larsson  <alexl@redhat.com>
+
+       * acconfig.h:
+       Added ENABLE_SHADOW_FB
+
+       * configure.in:
+       Added --disable-shadowfb
+
+       * gdk/linux-fb/gdkcursor-fb.c:
+       Update shadowfb when updating cursor
+
+       * gdk/linux-fb/gdkdrawable-fb2.c:
+       Added wrappers for shadowfb that calls  the normal drawable
+       methods, but calls gdk_shadow_fb_update(bounding box) when
+       GdkWindows are drawed to.
+       Moved gdk_draw_glyphs implementation to _gdk_draw_glyphs
+       which also returns the bounding box.
+
+       * gdk/linux-fb/gdkfb.h:
+       Added GdkFBAngle type and gdk_fb_set_rotation declaration.
+
+       * gdk/linux-fb/gdkgeometry-fb.c:
+       Update shadowfb when scrolling window.
+
+       * gdk/linux-fb/gdkglobals-fb.c:
+       Add _gdk_fb_screen_angle.
+       
+       * gdk/linux-fb/gdkkeyboard-fb.c:
+       Test code for screen rotation. Shift-F2 in the xlate driver
+       rotates the screen.
+
+       * gdk/linux-fb/gdkmain-fb.c:
+       Handle shadowfb. Add gdk_fb_set_rotation(). Remove CM and RP.
+
+       * gdk/linux-fb/gdkmouse-fb.c:
+       Use fb_width/height instead of modeinfo.xres/yres.
+
+       * gdk/linux-fb/gdkprivate-fb.h:
+       Added fb_men, fb_width, fb_height & fb_stride. When using
+       shadow fb these can differ from the framebuffer stuff.
+       Declarations for gdk_shadow_fb_update, gdk_shadow_fb_init,
+       gdk_shadow_fb_stop_updates, gdk_fb_recompute_all,
+       _gdk_fb_screen_angle. Removed CM, RP.
+
+       * gdk/linux-fb/gdkrender-fb.c:
+       Added code for shadowfb handling and screen rotation using
+       shadowfb.
+
+       * gdk/linux-fb/gdkwindow-fb.c:
+       Use fb_mem, fb_stride, fb_width, fb_height.
+       Added recompute_rowstride to reset the rowstride of all windows.
+       Added gdk_fb_recompute_all() which recomputes rootwindow size,
+       window abs positions and window rowstrides. Usefull when the
+       rotation has changed.
+
 Thu Jan 11 13:16:50 GMT 2001  Tony Gale <gale@gtk.org>
 
        * docs/faq/gtk-faq.sgml: update to make web site updating easier
index 32fc21dbf22706e3ec5f83ebfb4e67c2818b3d4b..f2f4b4a1ef00357f6e63e8e9e279863b70c76cb2 100644 (file)
@@ -47,6 +47,9 @@
 /* Define to use XKB extension */
 #undef HAVE_XKB
 
+/* Define to use shadowfb in the linux-fb port */
+#undef ENABLE_SHADOW_FB
+
 #undef XINPUT_NONE
 #undef XINPUT_GXI
 #undef XINPUT_XFREE
index e1beebac44e48941acc8640eedc33a4fe0edc9de..a333fe0eb14819aacb8fdcc7aff8a068e9831070 100644 (file)
@@ -133,6 +133,8 @@ case $gdktarget in
   *) AC_MSG_ERROR([Invalid target for GDK: use x11, nanox or linux-fb.]);;
 esac
 
+AC_ARG_ENABLE(shadowfb, [  --disable-shadowfb      disable shadowfb support for linux-fb],,enable_shadowfb=yes)
+       
 if test "x$enable_debug" = "xyes"; then
   test "$cflags_set" = set || CFLAGS="$CFLAGS -g"
   GTK_DEBUG_FLAGS="-DG_ENABLE_DEBUG"
@@ -146,6 +148,7 @@ fi
 
 AC_DEFINE_UNQUOTED(GTK_COMPILED_WITH_DEBUGGING, "${enable_debug}")
 
+                       
 # Build time sanity check...
 AM_SANITY_CHECK
 
@@ -591,11 +594,16 @@ if test "x$gdktarget" = "xlinux-fb"; then
   FREETYPE_CFLAGS="`$FREETYPE_CONFIG --cflags`"
   FREETYPE_LIBS="`$FREETYPE_CONFIG --libs`"
   CFLAGS="$CFLAGS $FREETYPE_CFLAGS"
+
+  if test x$enable_shadowfb = xyes ; then
+    AC_DEFINE(ENABLE_SHADOW_FB)
+  fi
   
   AM_CONDITIONAL(USE_LINUX_FB, true)
 else
   AM_CONDITIONAL(USE_LINUX_FB, false)
 fi
+AC_SUBST(ENABLE_SHADOW_FB)     
 AC_SUBST(FREETYPE_LIBS)
 AC_SUBST(FREETYPE_CFLAGS)
 
index 9aefc0abda78a1b8910898c9ec3ee6a08a1a9494..fd5288e6883cfc93914bf302078e5c31812b5c34 100644 (file)
@@ -337,6 +337,9 @@ gdk_fb_cursor_hide (void)
                              last_location.y,
                              last_contents_size.x,
                              last_contents_size.y);
+      gdk_shadow_fb_update (last_location.x, last_location.y,
+                           last_location.x + last_contents_size.x,
+                           last_location.y + last_contents_size.y);
     }
 }
 
@@ -409,6 +412,9 @@ gdk_fb_cursor_unhide()
                              last_location.x, last_location.y,
                              pixmap_last->width,
                              pixmap_last->height);
+      gdk_shadow_fb_update (last_location.x, last_location.y,
+                           last_location.x + pixmap_last->width,
+                           last_location.y + pixmap_last->height);
     }
   else
     gdk_fb_cursor_invalidate ();
index dd3f45d48b37d9dd45b9550ad2bbd2c00b1c5dd4..b5315802335b25fdefaefa74730bc22a1bfd5e83 100644 (file)
@@ -1,3 +1,4 @@
+#include "config.h"
 #include "gdkprivate-fb.h"
 #include "mi.h"
 #include <string.h>
@@ -76,6 +77,10 @@ static void         gdk_fb_draw_segments      (GdkDrawable      *drawable,
                                               GdkGC            *gc,
                                               GdkSegment       *segs,
                                               gint              nsegs);
+static void         gdk_fb_draw_lines         (GdkDrawable      *drawable,
+                                              GdkGC            *gc,
+                                              GdkPoint         *points,
+                                              gint              npoints);
 static GdkColormap* gdk_fb_get_colormap       (GdkDrawable      *drawable);
 static void         gdk_fb_set_colormap       (GdkDrawable      *drawable,
                                               GdkColormap      *colormap);
@@ -83,6 +88,81 @@ static gint         gdk_fb_get_depth          (GdkDrawable      *drawable);
 static GdkVisual*   gdk_fb_get_visual         (GdkDrawable      *drawable);
 static void         gdk_fb_drawable_finalize  (GObject *object);
 
+#ifdef ENABLE_SHADOW_FB
+static void         gdk_shadow_fb_draw_rectangle     (GdkDrawable      *drawable,
+                                                     GdkGC            *gc,
+                                                     gint              filled,
+                                                     gint              x,
+                                                     gint              y,
+                                                     gint              width,
+                                                     gint              height);
+static void         gdk_shadow_fb_draw_arc           (GdkDrawable      *drawable,
+                                                     GdkGC            *gc,
+                                                     gint              filled,
+                                                     gint              x,
+                                                     gint              y,
+                                                     gint              width,
+                                                     gint              height,
+                                                     gint              angle1,
+                                                     gint              angle2);
+static void         gdk_shadow_fb_draw_polygon       (GdkDrawable      *drawable,
+                                                     GdkGC            *gc,
+                                                     gint              filled,
+                                                     GdkPoint         *points,
+                                                     gint              npoints);
+static void         gdk_shadow_fb_draw_text          (GdkDrawable      *drawable,
+                                                     GdkFont          *font,
+                                                     GdkGC            *gc,
+                                                     gint              x,
+                                                     gint              y,
+                                                     const gchar      *text,
+                                                     gint              text_length);
+static void         gdk_shadow_fb_draw_text_wc       (GdkDrawable      *drawable,
+                                                     GdkFont          *font,
+                                                     GdkGC            *gc,
+                                                     gint              x,
+                                                     gint              y,
+                                                     const GdkWChar   *text,
+                                                     gint              text_length);
+static void         gdk_shadow_fb_draw_glyphs        (GdkDrawable      *drawable,
+                                                     GdkGC            *gc,
+                                                     PangoFont        *font,
+                                                     gint              x,
+                                                     gint              y,
+                                                     PangoGlyphString *glyphs);
+static void         gdk_shadow_fb_draw_drawable      (GdkDrawable      *drawable,
+                                                     GdkGC            *gc,
+                                                     GdkPixmap        *src,
+                                                     gint              xsrc,
+                                                     gint              ysrc,
+                                                     gint              xdest,
+                                                     gint              ydest,
+                                                     gint              width,
+                                                     gint              height);
+static void         gdk_shadow_fb_draw_image         (GdkDrawable      *drawable,
+                                                     GdkGC            *gc,
+                                                     GdkImage         *image,
+                                                     gint              xsrc,
+                                                     gint              ysrc,
+                                                     gint              xdest,
+                                                     gint              ydest,
+                                                     gint              width,
+                                                     gint              height);
+static void         gdk_shadow_fb_draw_points        (GdkDrawable      *drawable,
+                                                     GdkGC            *gc,
+                                                     GdkPoint         *points,
+                                                     gint              npoints);
+static void         gdk_shadow_fb_draw_segments      (GdkDrawable      *drawable,
+                                                     GdkGC            *gc,
+                                                     GdkSegment       *segs,
+                                                     gint              nsegs);
+static void         gdk_shadow_fb_draw_lines         (GdkDrawable      *drawable,
+                                                     GdkGC            *gc,
+                                                     GdkPoint         *points,
+                                                     gint              npoints);
+#endif
+
+
 static gpointer parent_class = NULL;
 
 static void
@@ -105,6 +185,20 @@ gdk_drawable_impl_fb_class_init (GdkDrawableFBClass *klass)
   object_class->finalize = gdk_fb_drawable_finalize;
   
   drawable_class->create_gc = _gdk_fb_gc_new;
+  
+#ifdef ENABLE_SHADOW_FB
+  drawable_class->draw_rectangle = gdk_shadow_fb_draw_rectangle;
+  drawable_class->draw_arc = gdk_shadow_fb_draw_arc;
+  drawable_class->draw_polygon = gdk_shadow_fb_draw_polygon;
+  drawable_class->draw_text = gdk_shadow_fb_draw_text;
+  drawable_class->draw_text_wc = gdk_shadow_fb_draw_text_wc;
+  drawable_class->draw_drawable = gdk_shadow_fb_draw_drawable;
+  drawable_class->draw_points = gdk_shadow_fb_draw_points;
+  drawable_class->draw_segments = gdk_shadow_fb_draw_segments;
+  drawable_class->draw_lines = gdk_shadow_fb_draw_lines;
+  drawable_class->draw_glyphs = gdk_shadow_fb_draw_glyphs;
+  drawable_class->draw_image = gdk_shadow_fb_draw_image;
+#else
   drawable_class->draw_rectangle = gdk_fb_draw_rectangle;
   drawable_class->draw_arc = gdk_fb_draw_arc;
   drawable_class->draw_polygon = gdk_fb_draw_polygon;
@@ -116,6 +210,7 @@ gdk_drawable_impl_fb_class_init (GdkDrawableFBClass *klass)
   drawable_class->draw_lines = gdk_fb_draw_lines;
   drawable_class->draw_glyphs = gdk_fb_draw_glyphs;
   drawable_class->draw_image = gdk_fb_draw_image;
+#endif
   
   drawable_class->set_colormap = gdk_fb_set_colormap;
   drawable_class->get_colormap = gdk_fb_get_colormap;
@@ -185,7 +280,6 @@ static void
 gdk_fb_set_colormap (GdkDrawable *drawable,
                     GdkColormap *colormap)
 {
-  GdkColormap *old_cmap;
   GdkDrawableFBData *private;
 
   private = GDK_DRAWABLE_FBDATA (drawable);
@@ -854,7 +948,7 @@ gdk_fb_draw_polygon (GdkDrawable    *drawable,
     }
 }
 
-void
+static void
 gdk_fb_draw_lines (GdkDrawable    *drawable,
                   GdkGC          *gc,
                   GdkPoint       *points,
@@ -913,21 +1007,23 @@ gdk_fb_drawable_clear (GdkDrawable *d)
 }
 
 static void
-gdk_fb_draw_glyphs (GdkDrawable      *drawable,
-                   GdkGC            *gc,
-                   PangoFont        *font,
-                   gint              x,
-                   gint              y,
-                   PangoGlyphString *glyphs)
+_gdk_fb_draw_glyphs (GdkDrawable      *drawable,
+                    GdkGC           *gc,
+                    PangoFont        *font,
+                    gint              x,
+                    gint              y,
+                    PangoGlyphString *glyphs,
+                    GdkRectangle     *bbox)
 {
   GdkFBDrawingContext fbdc;
-  FT_Bitmap bitmap;
   GdkPixmapFBData pixmap;
   PangoFT2Subfont subfont_index;
   PangoGlyphInfo *gi;
   FT_Face face;
   FT_UInt glyph_index;
   int i, xpos;
+  int maxy, miny;
+  int topy;
 
   g_return_if_fail (font);
 
@@ -938,6 +1034,8 @@ gdk_fb_draw_glyphs (GdkDrawable      *drawable,
   pixmap.drawable_data.abs_x = 0;
   pixmap.drawable_data.abs_y = 0;
   pixmap.drawable_data.depth = 78;
+
+  maxy = miny = 0;
   
   gi = glyphs->glyphs;
   for (i = 0, xpos = 0; i < glyphs->num_glyphs; i++, gi++)
@@ -959,12 +1057,15 @@ gdk_fb_draw_glyphs (GdkDrawable      *drawable,
              pixmap.drawable_data.rowstride = face->glyph->bitmap.pitch;
              pixmap.drawable_data.width = face->glyph->bitmap.width;
              pixmap.drawable_data.height = face->glyph->bitmap.rows;
-             
+
+             topy = y - face->glyph->bitmap_top + 1;
+             miny = MIN (miny, topy);
+             maxy = MAX (maxy, topy + face->glyph->bitmap.rows);
              gdk_fb_draw_drawable_3 (drawable, gc, (GdkPixmap *)&pixmap,
                                      &fbdc,
                                      0, 0,
                                      x + PANGO_PIXELS (xpos) + face->glyph->bitmap_left,
-                                     y - face->glyph->bitmap_top + 1,
+                                     topy,
                                      face->glyph->bitmap.width, face->glyph->bitmap.rows);
            }
        }
@@ -972,8 +1073,26 @@ gdk_fb_draw_glyphs (GdkDrawable      *drawable,
     }
 
   gdk_fb_drawing_context_finalize (&fbdc);
+
+  if (bbox)
+    {
+      bbox->x = x;
+      bbox->y = miny;
+      bbox->width = xpos;
+      bbox->height = maxy - miny;
+    }
 }
 
+static void
+gdk_fb_draw_glyphs (GdkDrawable      *drawable,
+                   GdkGC            *gc,
+                   PangoFont        *font,
+                   gint              x,
+                   gint              y,
+                   PangoGlyphString *glyphs)
+{
+  _gdk_fb_draw_glyphs (drawable, gc, font, x, y, glyphs, NULL);
+}
 
 static void
 gdk_fb_draw_image (GdkDrawable *drawable,
@@ -1021,3 +1140,328 @@ gdk_fb_get_visual (GdkDrawable    *drawable)
 {
   return gdk_visual_get_system();
 }
+
+#ifdef ENABLE_SHADOW_FB
+static void
+gdk_shadow_fb_draw_rectangle (GdkDrawable      *drawable,
+                             GdkGC            *gc,
+                             gint              filled,
+                             gint              x,
+                             gint              y,
+                             gint              width,
+                             gint              height)
+{
+  GdkDrawableFBData *private;
+
+  gdk_fb_draw_rectangle (drawable, gc, filled, x, y, width, height);
+
+  private = GDK_DRAWABLE_FBDATA (drawable);
+  if (GDK_IS_WINDOW (private->wrapper))
+    {
+      gint minx, miny, maxx, maxy;
+      gint extra_width;
+  
+      minx = x + private->abs_x;
+      miny = y + private->abs_y;
+      maxx = x + width + private->abs_x;
+      maxy = y + height + private->abs_y;
+      
+      if (!filled)
+       {
+         extra_width = (GDK_GC_FBDATA (gc)->values.line_width + 1) / 2;
+         
+         minx -= extra_width;
+         miny -= extra_width;
+         maxx += extra_width;
+         maxy += extra_width;
+       }
+      gdk_shadow_fb_update (minx, miny, maxx, maxy);
+    }
+}
+
+static void
+gdk_shadow_fb_draw_arc (GdkDrawable      *drawable,
+                       GdkGC            *gc,
+                       gint              filled,
+                       gint              x,
+                       gint              y,
+                       gint              width,
+                       gint              height,
+                       gint              angle1,
+                       gint              angle2)
+{
+  GdkDrawableFBData *private;
+  
+  gdk_fb_draw_arc (drawable, gc, filled, x, y, width, height, angle1, angle2);
+
+  private = GDK_DRAWABLE_FBDATA (drawable);
+  if (GDK_IS_WINDOW (private->wrapper))
+    {
+      gint minx, miny, maxx, maxy;
+      gint extra_width;
+  
+      minx = x + private->abs_x;
+      miny = x + private->abs_y;
+      maxx = x + width + private->abs_x;
+      maxy = y + height + private->abs_x;
+      
+      if (!filled)
+       {
+         extra_width = (GDK_GC_FBDATA (gc)->values.line_width + 1) / 2;
+         
+         minx -= extra_width;
+         miny -= extra_width;
+         maxx += extra_width;
+         maxy += extra_width;
+       }
+      gdk_shadow_fb_update (minx, miny, maxx, maxy);
+    }
+}
+
+static void
+gdk_shadow_fb_draw_polygon (GdkDrawable      *drawable,
+                           GdkGC            *gc,
+                           gint              filled,
+                           GdkPoint         *points,
+                           gint              npoints)
+{
+  GdkDrawableFBData *private;
+
+  gdk_fb_draw_polygon (drawable, gc, filled, points, npoints);
+
+  private = GDK_DRAWABLE_FBDATA (drawable);
+  if (GDK_IS_WINDOW (private->wrapper))
+    {
+      gint minx, miny, maxx, maxy;
+      gint extra_width;
+      int i;
+  
+      minx = maxx = points[0].x;
+      miny = maxy = points[0].y;
+
+      for (i=1;i<npoints;i++)
+       {
+         minx = MIN(minx, points[i].x);
+         maxx = MAX(maxx, points[i].x);
+         miny = MIN(miny, points[i].y);
+         maxy = MAX(maxy, points[i].y);
+       }
+      
+      if (!filled)
+       {
+         extra_width = (GDK_GC_FBDATA (gc)->values.line_width + 1) / 2;
+         
+         minx -= extra_width;
+         miny -= extra_width;
+         maxx += extra_width;
+         maxy += extra_width;
+       }
+      gdk_shadow_fb_update (minx + private->abs_x, miny + private->abs_y,
+                           maxx + private->abs_x, maxy + private->abs_y);
+    }
+}
+
+static void
+gdk_shadow_fb_draw_text (GdkDrawable      *drawable,
+                        GdkFont          *font,
+                        GdkGC            *gc,
+                        gint              x,
+                        gint              y,
+                        const gchar      *text,
+                        gint              text_length)
+{
+  gdk_fb_draw_text (drawable, font, gc, x, y, text, text_length);
+}
+
+static void
+gdk_shadow_fb_draw_text_wc (GdkDrawable      *drawable,
+                           GdkFont          *font,
+                           GdkGC            *gc,
+                           gint              x,
+                           gint              y,
+                           const GdkWChar   *text,
+                           gint              text_length)
+{
+  gdk_fb_draw_text_wc (drawable, font, gc, x, y, text, text_length);
+}
+
+static void
+gdk_shadow_fb_draw_glyphs (GdkDrawable      *drawable,
+                          GdkGC            *gc,
+                          PangoFont        *font,
+                          gint              x,
+                          gint              y,
+                          PangoGlyphString *glyphs)
+{
+  GdkDrawableFBData *private;
+  GdkRectangle bbox;
+  
+  _gdk_fb_draw_glyphs (drawable, gc, font, x, y, glyphs, &bbox);
+  
+  private = GDK_DRAWABLE_FBDATA (drawable);
+  if (GDK_IS_WINDOW (private->wrapper))
+    gdk_shadow_fb_update (bbox.x + private->abs_x, bbox.y + private->abs_y,
+                         bbox.x + private->abs_x + bbox.width, bbox.y + private->abs_y + bbox.height);
+}
+
+static void
+gdk_shadow_fb_draw_drawable (GdkDrawable      *drawable,
+                            GdkGC            *gc,
+                            GdkPixmap        *src,
+                            gint              xsrc,
+                            gint              ysrc,
+                            gint              xdest,
+                            gint              ydest,
+                            gint              width,
+                            gint              height)
+{
+  GdkDrawableFBData *private;
+  
+  gdk_fb_draw_drawable (drawable, gc, src, xsrc, ysrc, xdest, ydest, width, height);
+  
+  private = GDK_DRAWABLE_FBDATA (drawable);
+  if (GDK_IS_WINDOW (private->wrapper))
+    gdk_shadow_fb_update (xdest + private->abs_x, ydest + private->abs_y,
+                         xdest + private->abs_x + width, ydest + private->abs_y + height);
+}
+
+static void
+gdk_shadow_fb_draw_image (GdkDrawable      *drawable,
+                         GdkGC            *gc,
+                         GdkImage         *image,
+                         gint              xsrc,
+                         gint              ysrc,
+                         gint              xdest,
+                         gint              ydest,
+                         gint              width,
+                         gint              height)
+{
+  GdkDrawableFBData *private;
+  
+  gdk_fb_draw_image (drawable, gc, image, xsrc, ysrc, xdest, ydest, width, height);
+  
+  private = GDK_DRAWABLE_FBDATA (drawable);
+  if (GDK_IS_WINDOW (private->wrapper))
+    gdk_shadow_fb_update (xdest + private->abs_x, ydest + private->abs_y,
+                         xdest + private->abs_x + width, ydest + private->abs_y + height);
+}
+
+static void
+gdk_shadow_fb_draw_points (GdkDrawable      *drawable,
+                          GdkGC            *gc,
+                          GdkPoint         *points,
+                          gint              npoints)
+{
+  GdkDrawableFBData *private;
+
+  gdk_fb_draw_points (drawable, gc, points, npoints);
+
+  private = GDK_DRAWABLE_FBDATA (drawable);
+  if (GDK_IS_WINDOW (private->wrapper))
+    {
+      gint minx, miny, maxx, maxy;
+      int i;
+  
+      minx = maxx = points[0].x;
+      miny = maxy = points[0].y;
+
+      for (i=1;i<npoints;i++)
+       {
+         minx = MIN(minx, points[i].x);
+         maxx = MAX(maxx, points[i].x);
+         miny = MIN(miny, points[i].y);
+         maxy = MAX(maxy, points[i].y);
+       }
+      
+      gdk_shadow_fb_update (minx + private->abs_x, miny + private->abs_y,
+                           maxx + private->abs_x, maxy + private->abs_y);
+    }
+}
+
+static void
+gdk_shadow_fb_draw_segments (GdkDrawable      *drawable,
+                            GdkGC            *gc,
+                            GdkSegment       *segs,
+                            gint              nsegs)
+{
+  GdkDrawableFBData *private;
+
+  gdk_fb_draw_segments (drawable, gc, segs, nsegs);
+
+  private = GDK_DRAWABLE_FBDATA (drawable);
+  if (GDK_IS_WINDOW (private->wrapper))
+    {
+      gint minx, miny, maxx, maxy;
+      gint extra_width;
+      int i;
+  
+      minx = maxx = segs[0].x1;
+      miny = maxy = segs[0].y1;
+
+      for (i=0;i<nsegs;i++)
+       {
+         minx = MIN(minx, segs[i].x1);
+         maxx = MAX(maxx, segs[i].x1);
+         minx = MIN(minx, segs[i].x2);
+         maxx = MAX(maxx, segs[i].x2);
+         
+         miny = MIN(miny, segs[i].y1);
+         maxy = MAX(maxy, segs[i].y1);
+         miny = MIN(miny, segs[i].y2);
+         maxy = MAX(maxy, segs[i].y2);
+
+       }
+      
+      extra_width = (GDK_GC_FBDATA (gc)->values.line_width + 1) / 2;
+      
+      minx -= extra_width;
+      miny -= extra_width;
+      maxx += extra_width;
+      maxy += extra_width;
+      
+      gdk_shadow_fb_update (minx + private->abs_x, miny + private->abs_y,
+                           maxx + private->abs_x, maxy + private->abs_y);
+    }
+}
+
+static void
+gdk_shadow_fb_draw_lines (GdkDrawable      *drawable,
+                         GdkGC            *gc,
+                         GdkPoint         *points,
+                         gint              npoints)
+{
+  GdkDrawableFBData *private;
+
+  gdk_fb_draw_lines (drawable, gc, points, npoints);
+
+  private = GDK_DRAWABLE_FBDATA (drawable);
+  if (GDK_IS_WINDOW (private->wrapper))
+    {
+      gint minx, miny, maxx, maxy;
+      gint extra_width;
+      int i;
+  
+      minx = maxx = points[0].x;
+      miny = maxy = points[0].y;
+
+      for (i=1;i<npoints;i++)
+       {
+         minx = MIN(minx, points[i].x);
+         maxx = MAX(maxx, points[i].x);
+         miny = MIN(miny, points[i].y);
+         maxy = MAX(maxy, points[i].y);
+       }
+      
+      extra_width = (GDK_GC_FBDATA (gc)->values.line_width + 1) / 2;
+         
+      minx -= extra_width;
+      miny -= extra_width;
+      maxx += extra_width;
+      maxy += extra_width;
+      
+      gdk_shadow_fb_update (minx + private->abs_x, miny + private->abs_y,
+                           maxx + private->abs_x, maxy + private->abs_y);
+    }
+}
+
+#endif
index 7478b8c71e1667586e89262eab1abff25812ca05..71d97e448bd249b6ff887ad8300db9f253a49633 100644 (file)
@@ -22,6 +22,13 @@ extern const char *gdk_progclass;
 
 extern GdkAtom gdk_selection_property;
 
+typedef enum {
+  GDK_FB_0_DEGREES,
+  GDK_FB_90_DEGREES,
+  GDK_FB_180_DEGREES,
+  GDK_FB_270_DEGREES
+} GdkFBAngle;
+
 /* FB specific functions: */
 
 typedef gboolean (*GdkWindowChildChanged) (GdkWindow *window,
@@ -36,4 +43,7 @@ void      gdk_fb_window_set_child_handler (GdkWindow             *window,
                                           GdkWindowChildChanged changed,
                                           GdkWindowChildGetPos  get_pos,
                                           gpointer              user_data);
+
+void      gdk_fb_set_rotation             (GdkFBAngle angle);
+
 #endif /* GDKFB_H */
index ace62c6f1fc0ff2de413c445b9fc30113ccbde0e..3161b18cf9109509dcff2a84a739ad35b7db8c02 100644 (file)
@@ -48,6 +48,9 @@ gdk_window_scroll (GdkWindow *window,
                              dest_rect.x, dest_rect.y,
                              dest_rect.width, dest_rect.height,
                              FALSE, FALSE);
+      gdk_shadow_fb_update (dest_rect.x - dx, dest_rect.y - dy,
+                           dest_rect.x - dx + dest_rect.width,
+                           dest_rect.y - dy + dest_rect.height);
     }
   
   gdk_window_invalidate_region (window, invalidate_region, TRUE);
index 06fbd782090a5a351c51cd678ee270173b358f62..cab2c87383cdeb53ee5bda355250b403a61abf66 100644 (file)
@@ -41,3 +41,4 @@ GdkFBDisplay *gdk_display = NULL;
 GdkCursor *_gdk_fb_pointer_grab_cursor;
 GdkGC *_gdk_fb_screen_gc = NULL;
 GdkAtom gdk_selection_property;
+GdkFBAngle _gdk_fb_screen_angle = GDK_FB_0_DEGREES;
index 1c76236c6051b5660064cf4df9a8f2dbf6099a2b..812694701a2de9a5cc8169db1b956275425b6077 100644 (file)
@@ -768,6 +768,16 @@ xlate_io (GIOChannel *gioc,
                          (xlate_codes[j].modifier & GDK_SHIFT_MASK))
                        gdk_fb_redraw_all ();
 
+                     if ((xlate_codes[j].code == GDK_F2) &&
+                         (xlate_codes[j].modifier & GDK_SHIFT_MASK))
+                       {
+                         static gint deg = 0;
+                         deg = (deg + 1) % 4;
+                           
+                         gdk_fb_set_rotation (deg);
+                       }
+
+                     
                      gdk_fb_handle_key (xlate_codes[j].code,
                                         xlate_codes[j].code,
                                         xlate_codes[j].modifier,
index 24be099a4e2a0697eb266a77e900424b5821284f..54b2e67efd68686652ef785bf6ebb9c9ae82f628 100644 (file)
@@ -580,13 +580,13 @@ gdk_fb_display_new ()
   ioctl (display->fb_fd, FBIOBLANK, 0);
 
   /* We used to use sinfo.smem_len, but that seemed to be broken in many cases */
-  display->fbmem = mmap (NULL,
-                        display->modeinfo.yres * display->sinfo.line_length,
-                        PROT_READ|PROT_WRITE,
-                        MAP_SHARED,
-                        display->fb_fd,
-                        0);
-  g_assert (display->fbmem != MAP_FAILED);
+  display->fb_mmap = mmap (NULL,
+                          display->modeinfo.yres * display->sinfo.line_length,
+                          PROT_READ|PROT_WRITE,
+                          MAP_SHARED,
+                          display->fb_fd,
+                          0);
+  g_assert (display->fb_mmap != MAP_FAILED);
 
   if (display->sinfo.visual == FB_VISUAL_TRUECOLOR)
     {
@@ -595,6 +595,27 @@ gdk_fb_display_new ()
       display->blue_byte = display->modeinfo.blue.offset >> 3;
     }
 
+#ifdef ENABLE_SHADOW_FB
+  if (_gdk_fb_screen_angle % 2 == 0)
+    {
+      display->fb_width = display->modeinfo.xres;
+      display->fb_height = display->modeinfo.yres;
+    } 
+  else
+    {
+      display->fb_width = display->modeinfo.yres;
+      display->fb_height = display->modeinfo.xres;
+    }
+  display->fb_stride =
+    display->fb_width * (display->modeinfo.bits_per_pixel / 8);
+  display->fb_mem = g_malloc(display->fb_height * display->fb_stride);
+#else
+  display->fb_mem = display->fb_mmap;
+  display->fb_width = display->modeinfo.xres;
+  display->fb_height = display->modeinfo.yres;
+  display->fb_stride = display->sinfo.line_length;
+#endif
+
   return display;
 }
 
@@ -607,7 +628,7 @@ gdk_fb_display_destroy (GdkFBDisplay *display)
   /* Enable normal text on the console */
   ioctl (display->fb_fd, KDSETMODE, KD_TEXT);
   
-  munmap (display->fbmem, display->modeinfo.yres * display->sinfo.line_length);
+  munmap (display->fb_mmap, display->modeinfo.yres * display->sinfo.line_length);
   close (display->fb_fd);
 
   ioctl (display->console_fd, VT_ACTIVATE, display->start_vt);
@@ -634,6 +655,8 @@ _gdk_windowing_init_check (int argc, char **argv)
   if (!gdk_display)
     return FALSE;
 
+  gdk_shadow_fb_init ();
+  
   if (!gdk_fb_keyboard_open ())
     {
       g_warning ("Failed to initialize keyboard");
@@ -893,7 +916,7 @@ gdk_keyboard_ungrab (guint32 time)
 gint
 gdk_screen_width (void)
 {
-  return gdk_display->modeinfo.xres;
+  return gdk_display->fb_width;
 }
 
 /*
@@ -914,7 +937,7 @@ gdk_screen_width (void)
 gint
 gdk_screen_height (void)
 {
-  return gdk_display->modeinfo.yres;
+  return gdk_display->fb_height;
 }
 
 /*
@@ -1195,59 +1218,39 @@ gdk_event_make (GdkWindow *window,
   return NULL;
 }
 
-/* Debug hack. Call to find malloc area overwrites: */
-void CM (void)
+void
+gdk_fb_set_rotation (GdkFBAngle angle)
 {
-  static gpointer mymem = NULL;
-  gpointer arry[256];
-  int i;
-
-  return;
-
-  free (mymem);
-
-  for(i = 0; i < sizeof(arry)/sizeof(arry[0]); i++)
-    arry[i] = malloc (i+1);
-  for(i = 0; i < sizeof(arry)/sizeof(arry[0]); i++)
-    free (arry[i]);
-
-  mymem = malloc (256);
-}
-
-/* XXX badhack */
-typedef struct _GdkWindowPaint GdkWindowPaint;
+  if (angle == _gdk_fb_screen_angle)
+    return;
+  
+#ifdef ENABLE_SHADOW_FB
+  if (gdk_display)
+    {
+      gdk_shadow_fb_stop_updates ();
 
-struct _GdkWindowPaint
-{
-  GdkRegion *region;
-  GdkPixmap *pixmap;
-  gint x_offset;
-  gint y_offset;
-};
+      _gdk_fb_screen_angle = angle;
 
-void RP (GdkDrawable *d)
-{
-#if 0
-  if (GDK_DRAWABLE_TYPE(d) == GDK_DRAWABLE_PIXMAP)
-    {
-      if (!GDK_PIXMAP_FBDATA(d)->no_free_mem)
+      if (angle % 2 == 0)
        {
-         guchar *oldmem = GDK_DRAWABLE_FBDATA(d)->mem;
-         guint len = ((GDK_DRAWABLE_IMPL_FBDATA(d)->width * GDK_DRAWABLE_IMPL_FBDATA(d)->depth + 7) / 8) * GDK_DRAWABLE_IMPL_FBDATA(d)->height;
-         GDK_DRAWABLE_IMPL_FBDATA(d)->mem = g_malloc(len);
-         memcpy(GDK_DRAWABLE_IMPL_FBDATA(d)->mem, oldmem, len);
-         g_free(oldmem);
-       }
-    }
-  else
-    {
-      GSList *priv = GDK_WINDOW_P(d)->paint_stack;
-      for(; priv; priv = priv->next)
+         gdk_display->fb_width = gdk_display->modeinfo.xres;
+         gdk_display->fb_height = gdk_display->modeinfo.yres;
+       } 
+      else
        {
-         GdkWindowPaint *p = priv->data;
-
-         RP(p->pixmap);
+         gdk_display->fb_width = gdk_display->modeinfo.yres;
+         gdk_display->fb_height = gdk_display->modeinfo.xres;
        }
+      gdk_display->fb_stride =
+       gdk_display->fb_width * (gdk_display->modeinfo.bits_per_pixel / 8);
+      
+      gdk_fb_recompute_all();
+      gdk_fb_redraw_all ();
     }
+  else
+    _gdk_fb_screen_angle = angle;
+#else
+  g_warning ("Screen rotation without shadow fb not supported.");
 #endif
 }
+
index 63e8897c73b51752d1b46ba3e457abca42d22e74..b4908f45d31dea68ef2b81b54070d54e75d27836 100644 (file)
@@ -286,8 +286,8 @@ gdk_fb_mouse_open (void)
 
   mouse->dev = device;
   
-  mouse->x = gdk_display->modeinfo.xres / 2;
-  mouse->y = gdk_display->modeinfo.yres / 2;
+  mouse->x = gdk_display->fb_width / 2;
+  mouse->y = gdk_display->fb_height / 2;
 
   if (!device->open(mouse))
     {
@@ -645,8 +645,8 @@ gdk_fb_mouse_fidmour_packet (GdkFBMouse   *mouse,
       if (y > 8192)
        y -= 16384;
       /* Now map touchscreen coords to screen coords */
-      x *= ((double)gdk_display->modeinfo.xres)/4096.0;
-      y *= ((double)gdk_display->modeinfo.yres)/4096.0;
+      x *= ((double)gdk_display->fb_width)/4096.0;
+      y *= ((double)gdk_display->fb_height)/4096.0;
     }
   
   if (n)
index 44d8e57f536b141e42fdf518bd771c2f0f1d625b..2d69755a80fcfcc63f23bebed5a5ecfd8ba9c7ef 100644 (file)
@@ -40,7 +40,6 @@
 #include <stdio.h>
 #include <freetype/freetype.h>
 
-
 #define GDK_TYPE_DRAWABLE_IMPL_FBDATA (gdk_drawable_impl_fb_get_type ())
 #define GDK_DRAWABLE_IMPL_FBDATA(win) ((GdkDrawableFBData *)((GdkWindowObject *)(win))->impl)
 #define GDK_IS_DRAWABLE_IMPL_FBDATA(object)     (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_DRAWABLE_IMPL_FBDATA))
@@ -126,9 +125,15 @@ struct _GdkFBDisplay
   int tty_fd;
   int console_fd;
   int vt, start_vt;
-  
+
+  /* Used by rendering code: */
+  guchar *fb_mem;
+  gint fb_width; /* In pixels */
+  gint fb_height; /* In pixels */
+  gint fb_stride; /* In bytes */
+
   int fb_fd;
-  guchar *fbmem;
+  guchar *fb_mmap;
   gpointer active_cmap;
   gulong mem_len;
   struct fb_fix_screeninfo sinfo;
@@ -361,11 +366,20 @@ GdkGrabStatus gdk_fb_pointer_grab          (GdkWindow           *window,
                                            GdkCursor           *cursor,
                                            guint32              time,
                                            gboolean             implicit_grab);
-void gdk_fb_pointer_ungrab                 (guint32 time,
+void       gdk_fb_pointer_ungrab           (guint32 time,
                                            gboolean implicit_grab);
 
-guint32 gdk_fb_get_time                    (void);
+guint32    gdk_fb_get_time                 (void);
 
+void       gdk_shadow_fb_update            (gint                 minx,
+                                           gint                 miny,
+                                           gint                 maxx,
+                                           gint                 maxy);
+void       gdk_shadow_fb_init              (void);
+void       gdk_shadow_fb_stop_updates      (void);
+void       gdk_fb_recompute_all            (void);
+
+extern GdkFBAngle _gdk_fb_screen_angle;
 
 extern GdkWindow *_gdk_fb_pointer_grab_window, *_gdk_fb_pointer_grab_window_events, *_gdk_fb_keyboard_grab_window, *_gdk_fb_pointer_grab_confine;
 extern GdkEventMask _gdk_fb_pointer_grab_events, _gdk_fb_keyboard_grab_events;
@@ -394,8 +408,4 @@ void     gdk_fb_mouse_get_info (gint            *x,
                                gint            *y,
                                GdkModifierType *mask);
 
-
-extern void CM(void); /* Check for general mem corruption */
-extern void RP(GdkDrawable *drawable); /* Same, for pixmaps */
-
 #endif /* __GDK_PRIVATE_FB_H__ */
index b431c7d2fae4068be8d50d097b8187e6b4c628b3..1535aa805bd73b48272aba6ef53121ec97d93cdf 100644 (file)
@@ -1,5 +1,8 @@
+#include "config.h"
 #include "gdkprivate-fb.h"
 #include <string.h>
+#include <signal.h>
+#include <sys/time.h>
 
 /*
  * Reading pixel values from a generic drawable.
@@ -1200,6 +1203,251 @@ _gdk_fb_gc_calc_state (GdkGC           *gc,
          break;
        }
     }
+}
+
+#ifdef ENABLE_SHADOW_FB
+static void
+gdk_shadow_fb_copy_rect_0 (gint x, gint y, gint width, gint height)
+{
+  guchar *dst, *src;
+  gint depth;
 
+  depth = gdk_display->modeinfo.bits_per_pixel / 8;
+
+  dst = gdk_display->fb_mmap + x * depth + gdk_display->sinfo.line_length * y;
+  src = gdk_display->fb_mem + x * depth + gdk_display->fb_stride * y;
+
+  width = width*depth;
+  while (height>0)
+    {
+      memcpy (dst, src, width);
+      dst += gdk_display->sinfo.line_length;
+      src += gdk_display->fb_stride;
+      height--;
+    }
 }
 
+static void
+gdk_shadow_fb_copy_rect_90 (gint x, gint y, gint width, gint height)
+{
+  guchar *dst, *src, *pdst;
+  gint depth;
+  gint w;
+  gint i;
+
+  depth = gdk_display->modeinfo.bits_per_pixel / 8;
+
+  src = gdk_display->fb_mem + x * depth + gdk_display->fb_stride * y;
+  dst = gdk_display->fb_mmap + y * depth + gdk_display->sinfo.line_length * (gdk_display->fb_width - x - 1);
+
+  while (height>0)
+    {
+      w = width;
+      pdst = dst;
+      while (w>0) {
+       for (i=0;i<depth;i++)
+         *pdst++ = *src++;
+       pdst -= gdk_display->sinfo.line_length + depth;
+       w--;
+      }
+      dst += depth;
+      src += gdk_display->fb_stride - width * depth;
+      height--;
+    }
+}
+
+static void
+gdk_shadow_fb_copy_rect_180 (gint x, gint y, gint width, gint height)
+{
+  guchar *dst, *src, *pdst;
+  gint depth;
+  gint w;
+  gint i;
+
+  depth = gdk_display->modeinfo.bits_per_pixel / 8;
+
+  src = gdk_display->fb_mem + x * depth + gdk_display->fb_stride * y;
+  dst = gdk_display->fb_mmap + (gdk_display->fb_width - x - 1) * depth + gdk_display->sinfo.line_length * (gdk_display->fb_height - y - 1) ;
+
+  while (height>0)
+    {
+      w = width;
+      pdst = dst;
+      while (w>0) {
+       for (i=0;i<depth;i++)
+         *pdst++ = *src++;
+       pdst -= 2 * depth;
+       w--;
+      }
+      dst -= gdk_display->sinfo.line_length;
+      src += gdk_display->fb_stride - width * depth;
+      height--;
+    }
+}
+
+static void
+gdk_shadow_fb_copy_rect_270 (gint x, gint y, gint width, gint height)
+{
+  guchar *dst, *src, *pdst;
+  gint depth;
+  gint w;
+  gint i;
+
+  depth = gdk_display->modeinfo.bits_per_pixel / 8;
+
+  src = gdk_display->fb_mem + x * depth + gdk_display->fb_stride * y;
+  dst = gdk_display->fb_mmap + (gdk_display->fb_height - y - 1) * depth + gdk_display->sinfo.line_length * x;
+
+  while (height>0)
+    {
+      w = width;
+      pdst = dst;
+      while (w>0) {
+       for (i=0;i<depth;i++)
+         *pdst++ = *src++;
+       pdst += gdk_display->sinfo.line_length - depth;
+       w--;
+      }
+      dst -= depth;
+      src += gdk_display->fb_stride - width * depth;
+      height--;
+    }
+}
+
+static void (*shadow_copy_rect[4]) (gint x, gint y, gint width, gint height);
+
+volatile gint refresh_queued = 0;
+volatile gint refresh_x1, refresh_y1;
+volatile gint refresh_x2, refresh_y2;
+
+static void
+gdk_shadow_fb_refresh (int signum)
+{
+  gint minx, miny, maxx, maxy;
+
+  if (!refresh_queued)
+    {
+      struct itimerval timeout;
+      /* Stop the timer */ 
+      timeout.it_value.tv_sec = 0;
+      timeout.it_value.tv_usec = 0;
+      timeout.it_interval.tv_sec = 0;
+      timeout.it_interval.tv_usec = 0;
+      setitimer (ITIMER_REAL, &timeout, NULL);
+      return;
+    }
+  
+  minx = refresh_x1;
+  miny = refresh_y1;
+  maxx = refresh_x2;
+  maxy = refresh_y2;
+  refresh_queued = 0;
+
+  /* clip x */
+  if (minx < 0) {
+    minx = 0;
+    maxx = MAX (maxx, 0);
+  }
+  if (maxx >= gdk_display->fb_width) {
+    maxx = gdk_display->fb_width-1;
+    minx = MIN (minx, maxx);
+  }
+  /* clip y */
+  if (miny < 0) {
+    miny = 0;
+    maxy = MAX (maxy, 0);
+  }
+  if (maxy >= gdk_display->fb_height) {
+    maxy = gdk_display->fb_height-1;
+    miny = MIN (miny, maxy);
+  }
+  
+  (*shadow_copy_rect[_gdk_fb_screen_angle]) (minx, miny, maxx - minx + 1, maxy - miny + 1);
+}
+
+void
+gdk_shadow_fb_stop_updates (void)
+{
+  struct itimerval timeout;
+
+  refresh_queued = 0;
+
+  /* Stop the timer */ 
+  timeout.it_value.tv_sec = 0;
+  timeout.it_value.tv_usec = 0;
+  timeout.it_interval.tv_sec = 0;
+  timeout.it_interval.tv_usec = 0;
+  setitimer (ITIMER_REAL, &timeout, NULL);
+
+  refresh_queued = 0;
+}
+
+void
+gdk_shadow_fb_init (void)
+{
+  struct sigaction action;
+
+  action.sa_handler = gdk_shadow_fb_refresh;
+  sigemptyset (&action.sa_mask);
+  action.sa_flags = 0;
+  
+  sigaction (SIGALRM, &action, NULL);
+
+  shadow_copy_rect[GDK_FB_0_DEGREES] = gdk_shadow_fb_copy_rect_0;
+  shadow_copy_rect[GDK_FB_90_DEGREES] = gdk_shadow_fb_copy_rect_90;
+  shadow_copy_rect[GDK_FB_180_DEGREES] = gdk_shadow_fb_copy_rect_180;
+  shadow_copy_rect[GDK_FB_270_DEGREES] = gdk_shadow_fb_copy_rect_270;
+}
+
+/* maxx and maxy are included */
+void
+gdk_shadow_fb_update (gint minx, gint miny, gint maxx, gint maxy)
+{
+  struct itimerval timeout;
+  
+  g_assert (minx <= maxx);
+  g_assert (miny <= maxy);
+
+  if (refresh_queued)
+    {
+      refresh_x1 = MIN (refresh_x1, minx);
+      refresh_y1 = MIN (refresh_y1, miny);
+      refresh_x2 = MAX (refresh_x2, maxx);
+      refresh_y2 = MAX (refresh_y2, maxy);
+      refresh_queued = 1;
+    }
+  else
+    {
+      refresh_x1 = minx;
+      refresh_y1 = miny;
+      refresh_x2 = maxx;
+      refresh_y2 = maxy;
+      refresh_queued = 1;
+
+      getitimer (ITIMER_REAL, &timeout);
+      if (timeout.it_value.tv_usec == 0)
+       {
+         timeout.it_value.tv_sec = 0;
+         timeout.it_value.tv_usec = 20000; /* 20 ms => 50 fps */
+         timeout.it_interval.tv_sec = 0;
+         timeout.it_interval.tv_usec = 20000; /* 20 ms => 50 fps */
+         setitimer (ITIMER_REAL, &timeout, NULL);
+       }
+    }
+  
+}
+#else
+
+void
+gdk_shadow_fb_update (gint minx, gint miny, gint maxx, gint maxy)
+{
+}
+
+void
+gdk_shadow_fb_init (void)
+{
+}
+
+#endif
+
index ec656dd92f4d85ea7153f1c5e9947196670243dc..2030036d9425fe6f8118fbc502c1da7650cdaf30 100644 (file)
@@ -209,8 +209,8 @@ gdk_window_new (GdkWindow     *parent,
   impl->drawable_data.width = (attributes->width > 1) ? (attributes->width) : (1);
   impl->drawable_data.height = (attributes->height > 1) ? (attributes->height) : (1);
   private->window_type = impl->drawable_data.window_type = attributes->window_type;
-  impl->drawable_data.mem = gdk_display->fbmem;
-  impl->drawable_data.rowstride = gdk_display->sinfo.line_length;
+  impl->drawable_data.mem = gdk_display->fb_mem;
+  impl->drawable_data.rowstride = gdk_display->fb_stride;
   gdk_window_move_resize (window, x, y,
                          impl->drawable_data.width, impl->drawable_data.height);
 
@@ -775,9 +775,6 @@ gdk_window_hide (GdkWindow *window)
 
       private->mapped = FALSE;
 
-      if (private->parent == GDK_WINDOW_P(gdk_parent_root))
-       gdk_fb_drawable_clear(gdk_parent_root);
-
       mousewin = gdk_window_at_pointer (NULL, NULL);
       gdk_fb_window_send_crossing_events (mousewin, 
                                          GDK_CROSSING_NORMAL);
@@ -908,6 +905,33 @@ recompute_abs_positions(GdkDrawable *drawable,
     }
 }
 
+static void
+recompute_rowstride(GdkDrawable *drawable)
+{
+  GList *l;
+  GdkWindowObject *private;
+
+  g_return_if_fail (GDK_IS_WINDOW (drawable));
+
+  private = GDK_WINDOW_P (drawable);
+
+  GDK_DRAWABLE_IMPL_FBDATA (private)->rowstride = gdk_display->fb_stride;
+  for (l = private->children; l; l = l->next)
+    recompute_rowstride (l->data);
+}
+
+void
+gdk_fb_recompute_all (void)
+{
+  GDK_DRAWABLE_IMPL_FBDATA (gdk_parent_root)->width = gdk_display->fb_width;
+  GDK_DRAWABLE_IMPL_FBDATA (gdk_parent_root)->height = gdk_display->fb_height;
+  
+  recompute_abs_positions (gdk_parent_root,
+                          0, 0, 0, 0,
+                          gdk_display->fb_width, gdk_display->fb_height);
+  recompute_rowstride (gdk_parent_root);
+}
+
 static void
 recompute_drawable (GdkDrawable *drawable)
 {
@@ -1035,7 +1059,9 @@ gdk_fb_window_move_resize (GdkWindow *window,
                    }
                  gdk_fb_drawing_context_finalize (&fbdc);
                }
-
+             gdk_shadow_fb_update (region->extents.x1, region->extents.y1, 
+                                   region->extents.x2, region->extents.y2);
+             
              gdk_region_union (new_region, old_region);
              gdk_region_subtract (new_region, region);
              gdk_region_destroy (region);
@@ -1197,7 +1223,7 @@ _gdk_windowing_window_clear_area (GdkWindow *window,
       gdk_fb_drawing_context_finalize (&fbdc);
     }
   else if (!bgpm)
-    gdk_fb_draw_rectangle (GDK_DRAWABLE_IMPL (window), _gdk_fb_screen_gc, TRUE, x, y, width, height);
+    gdk_draw_rectangle (window, _gdk_fb_screen_gc, TRUE, x, y, width, height);
 }
 
 /* What's the diff? */
@@ -1489,8 +1515,8 @@ gdk_window_fb_get_visible_region (GdkDrawable *drawable)
 
   screen_rect.x = -priv->abs_x;
   screen_rect.y = -priv->abs_y;
-  screen_rect.width = gdk_display->modeinfo.xres;
-  screen_rect.height = gdk_display->modeinfo.yres;
+  screen_rect.width = gdk_display->fb_width;
+  screen_rect.height = gdk_display->fb_width;
   
   gdk_rectangle_intersect (&result_rect, &screen_rect, &result_rect);